HMAC KMSキーにて、aws cliとBoto3でMacの生成結果が一致しない

HMAC KMSキーにて、aws cliとBoto3でMacの生成結果が一致しない

Clock Icon2024.07.26

業務にてAWS Key Management Service(以下KMS)の、HMAC KMSキーを使ってuuidをメッセージとするハッシュ値(MAC)を生成する機会がありました。

その時、Lambdaの関数内で実行するBoto3のgenerate_mac()と、aws cliで実行するgenerate-macコマンドで、同じuuid、同じKMSキーを使っているのにも関わらず違う値がでる現象に悩まされたため記録として綴ります。

※今回KMSキーの作成手順は割愛します


起こっていた現象

KMSキーを使ってMACを生成するLambdaのコードはこんな感じです。
 2024-07-26 9.32.37
boto3のgenerate_mac()がMACを生成するメソッドです。引数を簡単に解説すると、

  • KeyId : 使用するHMAC KMSキーのARNまたはキーID
  • Message : ハッシュ化する対象となる文字列(バイト文字列のため変換しないといけない)
  • MacAlgorithm : MACのアルゴリズム、HMAC_SHA_224、HMAC_SHA_256、HMAC_SHA_384、HMAC_SHA_512から選択

戻り値のresponseは、

  • response["Mac"] : バイナリデータそのまま
  • response["Mac"].hex() : バイト列を16進数表記の文字列にしたもの、今回はこれで比較する
  • base64.b64encode(response[”Mac”]) : バイト列をBase64エンコードしたもの

という感じで確認しています

続いてaws cli

aws kms generate-mac \
    --key-id arn:aws:kms:ap-northeast-1:----------:key/************************************ \
    --message "0ce8d3dc-a48c-ed7f-aea9-1cdce57894c9" \
    --mac-algorithm HMAC_SHA_256 \
    --output text \
    --query Mac | base64 -d | xxd -p -c 32
  • —key-id にLamdaと同じkmsのARN(キーID)を指定
  • —message にLambda同じuuidを指定
  • —mac-algorithm にLambdaと同じHMAC_SHA_256を指定
  • バイト列を16進数表記(response["Mac"].hex()と一緒のやつ)にして表示したいので、 —output test と、—query Mac | base64 -d | xxd -p -c 32

これでそれぞれ実行したところ、
Lambda
 2024-07-26 9.37.40

aws cli
 2024-07-26 9.34.47

と、同じ条件のはずが違う出力結果に・・・

原因

aws cliの--messageの引数の渡し方に問題がありました
aws cliのリファレンスを見ると、--message(blob)
blob=Binary Large Object、つまりuuidをバイト文字列に変換してから渡す必要がありました
 2024-07-26 9.35.57
https://docs.aws.amazon.com/cli/latest/reference/kms/generate-mac.html

今回実施した手順としては、uuidを入力したテキストファイルを作り、fileb://ファイル名 でファイルの中身をバイト文字列に変換して引数を渡すように
 2024-07-26 9.36.07
 2024-07-26 9.36.14

さっきのLambdaの実行結果
 2024-07-26 9.37.40

出力が一致したのでOK!

Boto3 generate_mac() ドキュメント
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms/client/generate_mac.html

おわりに

  • 今回初めてバイト文字列について知りました、最近低レイヤーに関する本を読んでいたのですが、早速その知識が役にたつ状況に出会えて少し嬉しい☺️
  • 本件についてGPT-4oやClaudeに尋ねてみましたが、結局公式リファレンスを見るまで解決しませんでした・・・生成AIに頼りすぎるのも良くないですね

バイト文字列について
https://dev.classmethod.jp/articles/python-bytes-newshiro/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.